package com.by.model;

/**
 * @author ServivE
 * @version 0.1
 * @className SecurityUser
 * @description
 * @date 2024/12/4 19:10
 * @since jdk17
 */

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

/**
 * 由于Spring Security安全框架中能够识别的用户对象类型是UserDetails接口对象，
 * 所以不管是后台管理系统的用户登录还是用户购物系统的用户登录，
 * 项目中统一使用封装的SecurityUser对象来实现UserDetails用于项目中返回的用户对象
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SecurityUser implements UserDetails {
    // 后台管理系统用户属性

    /**
     * 用户标识
     */
    private Long userId;

    /**
     * 用户名称
     *
     */
    private String username;

    /**
     * 用户密码
     *
     */
    private String password;

    /**
     * 登录类型
     */
    private String loginType;

    /**
     * 用户状态
     */
    private Integer status;

    /**
     * 用户所属店铺标识
     */
    private Long shopId;
    /**
     * 用户权限
     */
    private Set<String> perms = new HashSet<>();
    // TODO 用户购物车系统用户属性还未添加

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return null;
    }

    @Override
    public String getPassword() {
        return this.password;
    }

    /**
     * 在Spring Security框架中用户的唯一身份，不能重复
     * @return
     */
    @Override
    public String getUsername() {
        return this.loginType + this.userId;
    }

    @Override
    public boolean isAccountNonExpired() {
        return this.status == 1;
    }

    @Override
    public boolean isAccountNonLocked() {
        return this.status == 1;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return this.status == 1;
    }

    @Override
    public boolean isEnabled() {
        return this.status == 1;
    }

    /**
     * 由于查询的权限记录中包含多个权限，多个权限之间是通过“,”号拼接，
     * 所以需要将每一条权限记录中的权限进行分隔处理，方便后续业务模块中对资源的鉴权
     * @param perms
     */
    public void setPerms(Set<String> perms) {
        HashSet<String> finalPermsSet = new HashSet<>();
        perms.forEach(perm ->{
            //判断权限记录是否包含","号
            if (perm.contains(",")) {
                //根据","分割
                String[] realPerms = perm.split(",");
                //循环遍历获取每一个权限  存放到最终权限集合中
                for (String realperm : realPerms) {
                    finalPermsSet.add(realperm);
                }
            } else {
                finalPermsSet.add(perm);
            }
        });
        this.perms = finalPermsSet;
    }
}
